package club.xiaojiawei.array;

import java.util.Arrays;

/**
 * @author 肖嘉威
 * @version 1.0
 * @date 2022/4/18 14:57
 * @question 283.移动零
 * @description 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 */
public class RemoveZero283 {
    public static void main(String[] args) {
        int[] arr={0,1,1,0,0,11,0,0,0,11,0,0,0,1,1,1,1};
        int[] arr1={0,1,1,0,0,11,0,0,0,11,0,0,0,1,1,1,1};
        moveZeroes(arr);
        moveZeroes1(arr1);
    }

    /**
     * 快慢指针
     * @param nums
     */
    public static void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0){
            return;
        }
        int fast = 0;
        int slow = 0;
        int count = 0;
        int length = nums.length;
        for (; fast < length; fast++){
            if (nums[fast]!=0){
                nums[slow] = nums[fast];
                count++;
                if (fast != slow++){
                    nums[fast] = 0;
                    count++;
                }
            }
        }
        System.out.println(count);
        System.out.println(Arrays.toString(nums));
    }

    /**
     * step法
     * @param nums
     */
    public static void moveZeroes1(int[] nums) {
        if (nums == null || nums.length == 0){
            return;
        }
        int step = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0){
                step++;
            }else if (step != 0){
                nums[i - step] = nums[i];
                nums[i] = 0;
            }
        }
        System.out.println(Arrays.toString(nums));
    }
}
